package com.boomsecret.redis;

import redis.clients.jedis.Jedis;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by wangjinliang on 2018/1/22.
 */
public final class RedisHashUtils {

    private RedisHashUtils() {}

    private static Jedis getJedis() {
        return RedisUtils.getJedis();
    }

    private static void releaseJedis(Jedis jedis) {
        RedisUtils.releaseJedis(jedis);
    }

    /**
     * 从hash中删除指定的存储
     * @param key
     * @param fieid 存储的名字
     * @return 状态码 1成功 0失败
     */
    public static long hdel(String key, String fieid) {
        Jedis jedis = getJedis();
        long s = jedis.hdel(key, fieid);
        releaseJedis(jedis);
        return s;
    }

    /**
     * 删除某Hash
     * @param key
     * @return
     */
    public static long hdel(String key) {
        Jedis jedis = getJedis();
        long s = jedis.del(key);
        releaseJedis(jedis);
        return s;
    }

    /**
     * hash中指定的存储是否存在
     * @param key
     * @param field 存储的名字
     * @return
     */
    public static boolean hexists(String key, String field) {
        Jedis jedis = getJedis();
        boolean s = jedis.hexists(key, field);
        releaseJedis(jedis);
        return s;
    }

    /**
     * 返回hash中指定存储位置的值
     * @param key
     * @param field 存储的名字
     * @return 存储对应的值
     */
    public static String hget(String key, String field) {
        Jedis jedis = getJedis();
        String s = jedis.hget(key, field);
        releaseJedis(jedis);
        return s;
    }

    /**
     * 返回hash中指定存储位置的值
     * @param key
     * @param fieid
     * @return
     */
    public static byte[] hget(byte[] key, byte[] fieid) {
        Jedis jedis = getJedis();
        byte[] s = jedis.hget(key, fieid);
        releaseJedis(jedis);
        return s;
    }

    /**
     * 以Map的形式返回hash中的存储和值
     * @param key
     * @return
     */
    public static Map<String, String> hgetAll(String key) {
        Jedis jedis = getJedis();
        Map<String, String> map = jedis.hgetAll(key);
        releaseJedis(jedis);
        return map;
    }

    /**
     * 添加一个对应关系
     * @param key
     * @param field
     * @param value
     * @return 状态码 1成功 0失败 field已存在将更新也返回0
     */
    public static long hset(String key, String field, String value) {
        Jedis jedis = getJedis();
        long s = jedis.hset(key, field, value);
        releaseJedis(jedis);
        return s;
    }

    /**
     * 添加一个对应关系
     * @param key
     * @param field
     * @param value
     * @return
     */
    public static long hset(String key, String field, byte[] value) {
        Jedis jedis = getJedis();
        long s = jedis.hset(key.getBytes(), field.getBytes(), value);
        releaseJedis(jedis);
        return s;
    }

    /**
     * 添加对应关系, 只有在field不存在时才执行
     * @param key
     * @param field
     * @param value
     * @return 状态码 1成功 0失败field已存
     */
    public static long hsetnx(String key, String field, String value) {
        Jedis jedis = getJedis();
        long s = jedis.hsetnx(key, field, value);
        releaseJedis(jedis);
        return s;
    }

    /**
     * 获取hash中value的集合
     * @param key
     * @return
     */
    public static List<String> hvals(String key) {
        Jedis jedis = getJedis();
        List<String> list = jedis.hvals(key);
        releaseJedis(jedis);
        return list;
    }

    /**
     * 在指定的存储位置加上指定的数字, 存储位置的值必须可转为数字类型
     * @param key
     * @param field 存储位置
     * @param value 要增加的值, 可以是负数
     * @return 增加指定数字后，存储位置的值
     */
    public static long hincrby(String key, String field, long value) {
        Jedis jedis = getJedis();
        long s = jedis.hincrBy(key, field, value);
        releaseJedis(jedis);
        return s;
    }

    /**
     * 返回指定hash中的所有存储名字, 类似Map中的keySet方法
     * @param key
     * @return 存储名称的集合
     */
    public static Set<String> hkeys(String key) {
        Jedis jedis = getJedis();
        Set<String> set = jedis.hkeys(key);
        releaseJedis(jedis);
        return set;
    }

    /**
     * 获取hash中存储的个数, 类似Map中size方法
     * @param key
     * @return
     */
    public static long hlen(String key) {
        Jedis jedis = getJedis();
        long len = jedis.hlen(key);
        releaseJedis(jedis);
        return len;
    }

    /**
     * 根据多个key, 获取对应的value, 返回List; 如果指定的key不存在, List对应位置为null
     * @param key
     * @param fields
     * @return
     */
    public static List<String> hmget(String key, String... fields) {
        Jedis jedis = getJedis();
        List<String> list = jedis.hmget(key, fields);
        releaseJedis(jedis);
        return list;
    }

    /**
     * 根据多个key, 获取对应的value, 返回List; 如果指定的key不存在, List对应位置为null
     * @param key
     * @param fields
     * @return
     */
    public static List<byte[]> hmget(byte[] key, byte[]... fields) {
        Jedis jedis = getJedis();
        List<byte[]> list = jedis.hmget(key, fields);
        releaseJedis(jedis);
        return list;
    }

    /**
     * 添加对应关系, 如果对应关系已存在, 则覆盖
     * @param key
     * @param map
     * @return 状态, 成功返回OK
     */
    public static String hmset(String key, Map<String, String> map) {
        Jedis jedis = getJedis();
        String s = jedis.hmset(key, map);
        releaseJedis(jedis);
        return s;
    }

    /**
     * 添加对应关系, 如果对应关系已存在，则覆盖
     * @param key
     * @param map
     * @return
     */
    public static String hmset(byte[] key, Map<byte[], byte[]> map) {
        Jedis jedis = getJedis();
        String s = jedis.hmset(key, map);
        releaseJedis(jedis);
        return s;
    }
}
